package com.itlong.cloud.property.dao;

import com.itlong.cloud.POJO.PO.*;
import com.itlong.cloud.POJO.VO.property.*;
import com.itlong.cloud.abstracts.IAbstractBaseDao;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * <desc>
 *      物业系统用户信息数据访问接口
 * </desc>
 *
 * @createDate 2017/10/10
 */
@Mapper
@Repository
public interface IPropertyUserInfoDao extends IAbstractBaseDao<PropertyUserInfoPO>{
    /**
     * <desc>
     *      保存人员
     * </desc>
     *
     * @param params 数据参数
     * @return
     * @author Biao.R
     * @createDate 2017/10/10
     */
    Integer save(Map<String, Object> params);

    /**
     * <desc>
     *      修改人员
     * </desc>
     *
     * @param params 数据参数
     * @return
     * @author Biao.R
     * @createDate 2017/10/10
     */
    Integer update(Map<String, Object> params);

    /**
     * <desc>
     *      根据id获取用户信息
     * </desc>
     *
     * @param PropertyUserInfoPO 用户实体
     * @return 用户VO实体
     * @author Biao.R
     * @createDate 2017/10/10
     */
    PropertyUserInfoGetOneVO getOneForVO(PropertyUserInfoPO PropertyUserInfoPO);

    /**
     * <desc>
     *      获取分页数据集
     * </desc>
     *
     * @param params  查询参数
     * @return
     * @author Biao.R
     * @createDate 2017/10/10
     */
    List<PropertyUserInfoGetUserPageVO> getPage(Map<String, Object> params);


    /**
     * <desc>
     *      获取分页总数量
     * </desc>
     *
     * @param params 查询参数
     * @return
     * @author Biao.R
     * @createDate 2017/10/10
     */
    Integer getPageCount(Map<String, Object> params);

    /**
     * <desc>
     *      获取该项目中物业人员的最大编号
     * </desc>
     *@param projectId 项目编号
     * @return 最大编号
     * @author Biao.R
     * @createDate 2017/09/26
     */
    String getMaxNum(@Param("projectId") String projectId);

    /**
     * <desc>
     *      删除
     * </desc>
     *
     * @param userIds 用户id数组
     * @return sql执行行数
     * @author Biao.R
     * @createDate 2017/10/10
     */
    Integer delete(@Param("userIds") String[] userIds, @Param("updateTime") Date updateTime);

    /**
     * <desc>
     *      保存用户角色
     * </desc>
     *
     * @param params 数据参数map
     * @return
     * @author Biao.R
     * @createDate 2017/10/11
     */
    Integer saveUserRoles(Map<String, Object> params);

    /**
     * <desc>
     *      检测账号是否已存在
     * </desc>
     *
     * @param userName 用户名
     * @return
     * @author Biao.R
     * @createDate 2017/10/11
     */
    Integer checkUserName(@Param("userName") String userName);

    /**
     * <desc>
     *      删除用户的角色
     * </desc>
     *
     * @param userId 用户id
     * @param roleIds 角色id 多个,号分隔
     * @return
     * @author Biao.R
     * @createDate 2017/10/11
     */
    Integer deleteUserRoles(@Param("userId") String userId, @Param("roleIds") String[] roleIds);

    /**
     * <desc>
     *      物业登录时，根据物业账号+密码查询物业人员信息
     * <desc/>
     * @param  param     查询参数（管理员账号+密码）
     * @return  查询到的用户信息
     * @author Biao.R
     * @createDate 2017/10/16
     */
    PropertyUserInfoPO checkUserByUserName(Map<String, String> param);

    /**
     * <desc>
     *      物业登录时，根据项目编号+管理员密码查询管理员信息
     * <desc/>
     * @param  param     查询参数（管理员账号+密码）
     * @return  查询到的用户信息
     * @author Biao.R
     * @createDate 2017/10/16
     */
    PropertyUserInfoPO checkUserByProjectId(Map<String, Object> param);

    /**
     * <desc>
     *      登录时获取登录相关信息
     * <desc/>
     * @param   userId  物业人员userId
     * @param   projectId  当前登录小区ID
     * @return  查询到的小区角色对象集
     * @author Biao.R
     * @createDate 2017/10/16
     */
    List<PropertyProjectRoleVO> getProjectRole(@Param("userId") String userId,@Param("projectId") String projectId);


    /**
     * <desc>
     *      重置用户密码
     * </desc>
     *
     * @param userIds 用户id数组
     * @param password 密码
     * @return
     * @author Biao.R
     * @createDate 2017/10/12
     */
    Integer resetPassword(
            @Param("userIds") String[] userIds,
            @Param("password")String password,
            @Param("updateTime")Date updateTime);

    /**
     * <desc>
     *      根据条件查询人员
     * </desc>
     * @param    params  查询参数
     * @return  List<PropertyUserInfoPO> 人员实体集合
     * @author Biao.R
     * @createDate 2017/10/13
     *
     */
    List<PropertyUserInfoPO> getByFields(Map<String, Object> params);

    /**
     * <desc>
     *      根据条件查询人员是否存在 1-存在  0-不存在
     * </desc>
     * @param    params  查询参数
     * @return  符合结果的数量
     * @author Biao.R
     * @createDate 2017/10/13
     *
     */
    Integer isPropertyUserExist(Map<String, Object> params);

    /**
     * <desc>
     *      根据条件查询人员与项目间的关系
     * </desc>
     * @param    params  查询参数
     * @return  List<PropertyRoleProjectPO> 人员实体集合
     * @author Biao.R
     * @createDate 2017/10/13
     */
    List<PropertyRoleProjectPO> getRoleProject(Map<String, Object> params);

    /**
     * <desc>
     *      根据ID物理删除 property_role_project 数据
     * </desc>
     * @return  List<PropertyRoleProjectPO> 人员实体集合
     * @author Biao.R
     * @createDate 2017/10/13
     */
    void deleteUserRolesById(List<PropertyRoleProjectPO> roleProjectPOList);

    /**
     * <desc>
     *      根据userId查询相关性信息
     * </desc>
     * @param    userId  property_role_project 的自增ID
     * @return  PropertyUserInfoGetOneVO 人员实体集合
     * @author Biao.R
     * @createDate 2017/10/13
     */
    PropertyUserInfoGetOneVO getById(@Param("userId") String userId);

    /**
     * <desc>
     *      根据userId查询物业用户
     * <desc/>
     * @param  userId   待查询的用户Id
     * @return  查询到的物业用户对象
     * @author Biao.R
     * @createDate 2017/12/5
     */
    PropertyUserInfoPO getUserByUserId(@Param("userId") String userId);

    /**
     * <desc>
     *      查询物业用户所属项目信息
     * <desc/>
     * @param  userId   待查询用户userId
     * @return 查询到的项目状态信息
     * @author Biao.R
     * @createDate 2017/12/11
     */
    List<Integer> getProjectByUserId(@Param("userId") String userId);

    /**
     * <desc>
     *      根据电梯cardId查询userId
     * </desc>
     *
     * @param cardId
     * @return
     * @author Jiaqi.X
     * @createDate 2018/03/25
     */
    String getUserIdByCardId(@Param("cardId") String cardId);

    /**
     * <desc>
     *     更新用户人脸注册信息
     * </desc>
     * @param appUserProjectPO
     * @return
     * @author Qiang.S
     * @createDate 2018/05/18
     */
    Integer updatePreUserBaiduFaceInfo(AppUserProjectPO appUserProjectPO);

    /**
     * <desc>
     *      登录时根据用户ID获取登录相关信息
     * <desc/>
     * @param   userId  物业人员userId
     * @param   projectId  当前登录小区ID
     * @return  查询到的小区角色对象集
     * @author JuGuang.S
     * @createDate 2018/07/03
     */
    List<PropertyProjectRoleVO> getProjectRoleByUserId(@Param("userId") String userId,@Param("projectId") String projectId);

    /**
     * <desc>
     *      查询指定角色所有用户
     * </desc>
     *
     * @param projectId 项目id
     * @param roleId 角色id
     * @return 用户列表
     * @author wangzhi
     * @createDate 2018/08/15
     */
    List<PropertyGetRoleUserVO> getRoleUser(@Param("projectId") String projectId, @Param("roleId") String roleId);

    /**
     * <desc>
     *     查询此身份证是否已被绑定
     * </desc>
     *
     * @param userId 用户编号
     * @param projectId 项目编号
     * @param idcardKey 身份证序号
     * @return
     * @author Qiang.S
     * @createDate 2018-08-22
     */
    Integer getIDCardByUserId(@Param("userId") String userId,
                              @Param("projectId") String projectId,
                              @Param("idcardKey") String idcardKey);

    /**
     * <desc>
     *     更新身份证序号信息
     * </desc>
     *
     * @param userId 用户编号
     * @param projectId 项目编号
     * @param idcardKey 身份证序号
     * @param idCard 身份证号
     * @return
     * @author Qiang.S
     * @createDate 2018-08-22
     */
    Integer updateIDCardInfo(@Param("userId") String userId,
                          @Param("projectId") String projectId,
                          @Param("idcardKey") String idcardKey,
                             @Param("isBindingIdcard") String isBindingIdcard,
                             @Param("idCard") String idCard,
                             @Param("mark") String mark);

    /**
     * <desc>
     *     身份证挂失信息更新
     * </desc>
     *
     * @param userId 用户编号
     * @param projectId 项目编号
     * @param isLoss 挂失状态:0 正常,1 挂失
     * @return
     * @author Qiang.S
     * @createDate 2019-02-20
     */
    Integer updateIsLossInfo(@Param("userId") String userId,
                             @Param("projectId") String projectId,
                             @Param("isLoss") String isLoss);

    /**
     * <desc>
     *      查询物业管理员账号名字
     * </desc>
     *
     * @param projectId 项目id
     * @return 物业名字
     * @author wangzhi
     * @createDate 2018/08/31
     */
    String getPropertyNameByProjectIdAndRole5(@Param("projectId") String projectId);


    /**
     * <desc>
     *      查询集团物业管理员账号名字
     * </desc>
     *
     * @param projectId 项目id
     * @return 物业名字
     * @author wangzhi
     * @createDate 2018/08/31
     */
    String getPropertyNameByProjectIdAndRole3(@Param("projectId") String projectId);

    /**
     * <desc>
     *      由身份证序列号查询用户信息
     * </desc>
     *
     * @param idCardKey 身份证序列号
     * @return 用户信息
     * @author wangzhi
     * @createDate 2019/02/28
     */
    Map<String,Object> getUserInfoByIdCardKey(@Param("idCardKey") String idCardKey,@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取物业用户完善信息
     * </desc>
     *
     * @param userId 用户id
     * @return 用户信息
     * @author wangzhi
     * @createDate 2019/08/08
     */
    PropertyUserLoginCheckVO getCompleteInfo(@Param("userId") String userId);

    /**
     * <desc>
     *      获取房间类型
     * <desc/>
     *
     * @param roomId 房间Id
     * @param  projectId  项目Id
     * @return 房间类型
     * @author Juguang.S
     * @createDate 2019/08/14
     */
    Integer getHousesType(@Param("roomId") String roomId,@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取用户已认证的房屋信息
     * </desc>
     *
     * @param userId 用户id
     * @param projectId 项目id
     * @return
     * @author Jiaqi.X
     * @createDate 2017/11/23
     */
    List<Map<String,Object>> getUserRoomsInfos(@Param("userId") String userId,
                                               @Param("projectId") String projectId);

    /**
     * <desc>
     *      删除用户门禁权限组权限
     * </desc>
     *
     * @param userId
     * @param projectId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/09/04
     */
    Integer delEntranceAuth(@Param("userId") String userId,@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取用户门禁临时权限
     * </desc>
     * @param userId
     * @param projectId
     * @return
     */
    String getDoorTempAuth(@Param("userId") String userId,@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取用户门禁临时权限
     * </desc>
     * @param userId
     * @param projectId
     * @return
     */
    String getDoorGroupAuth(@Param("userId") String userId,@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取用户电梯临时权限
     * </desc>
     *
     * @param userId
     * @param projectId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/09/25
     */
    String getElevatorTempAuth(@Param("userId") String userId,@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取用户电梯分组权限
     * </desc>
     *
     * @param userId
     * @param projectId
     * @return
     * @author Juguang.S
     * @createDate 2021/04/13
     */
    String getElevatorGroupAuth(@Param("userId") String userId,@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取用户云对讲临时权限
     * </desc>
     *
     * @param userId
     * @param projectId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/09/25
     */
    String getCloudTalkTempAuth(@Param("userId") String userId,@Param("projectId") String projectId);

    /**
     * <desc>
<<<<<<< HEAD:service/service-user/src/main/java/com/itlong/cloud/property/dao/IPropertyUserInfoDao.java
     *      删除角色项目信息
     * </desc>
     *
     * @author wangzhi
     * @createDate 2019/12/24
     */
    Integer deleteRoleProject(@Param("roleIds") String[] roleIds);

    /**
     * <desc>
     *      删除角色菜单信息
     * </desc>
     *
     * @author wangzhi
     * @createDate 2020/02/19
     */
    Integer deleteRoleFunction(@Param("roleIds") String[] roleIdArr);

    /**
     * <desc>
     *      批量保存人员角色关系
     * </desc>
     *
     * @author wangzhi
     * @createDate 2019/12/25
     */
    Integer batchSaveRoleProjectPO(List<PropertyRoleProjectPO> roleProjectPOList);

    /**
     * <desc>
     *      批量保存用户部门角色关系
     * </desc>
     *
     * @author wangzhi
     * @createDate 2019/12/25
     */
    Integer batchSaveUserGroupRole(List<PropertyUserGroupRolePO> propertyUserGroupRolePOList);

    /**
     * <desc>
     *      删除用户项目信息
     * </desc>
     *
     * @author wangzhi
     * @createDate 2019/12/25
     */
    Integer deleteUserProject(@Param("userIdArr") String[] userIdArr);

    /**
     * <desc>
     *      删除用户部门角色信息
     * </desc>
     *
     * @author wangzhi
     * @createDate 2019/12/25
     */
    Integer deleteUserGroupRole(@Param("userIdArr") String[] userIdArr);

    /**
     * <desc>
     *      找回密码时，通过账号获取绑定手机号
     * <desc/>
     *
     * @return 相关参数
     * @author wangzhi
     * @createDate 2019/12/25
     */
    Map<String,Object> getPhoneNumByUserName(@Param("userName") String userName);

    /**
     * <desc>
     *      根据楼栋名称、单元名称、房间号 查询房间信息
     * </desc>
     *
     * @param buildName
     * @param unitName
     * @param roomNum
     * @return
     * @auhtor Jiaqi.X
     * @createDate 2018/08/30
     */
    Map<String,Object> getRoomInfoByBuildNameAndUnitNameAndRoomNum(@Param("buildName") String buildName,
                                                                   @Param("unitName") String unitName,
                                                                   @Param("roomNum")String roomNum,
                                                                   @Param("projectId") String projectId);

    /**
     * <desc>
     *      获取修改前的用户名称及标签
     * </desc>
     *
     * @param userId
     * @param projectId
     * @return
     * @author Juguang.S
     * @createDate 2020/05/20
     */
    Map<String,Object> getOldUserInfo(@Param("userId") String userId,@Param("projectId") String projectId);

    /**
     * <desc>
     *      清除用户临时门禁权限
     * </desc>
     *
     * @param userId
     * @param projectId
     * @return
     * @author Qiang.S
     * @createDate 2020/07/07
     */
    Integer deleteUserEntrance(@Param("userId") String userId,@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取用户类型id
     * </desc>
     *
     * @param params 查询参数
     * @return
     * @Author Zhu.yj
     * @createDate  2021/4/9
     */
    Integer getUserTypeIdByName(Map<String, Object> params);

    /**
     * <desc>
     *      获取未读的待审批系统消息
     * </desc>
     *
     * @param
     * @return
     * @Author Zhu.yj
     * @createDate  2021/4/28
     */
    PropertyCloudServiceCostMessageInfoPO getMessage(@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取项目下待审核用户数量
     * </desc>
     *
     * @param projectId 项目id
     * @return
     * @Author Zhu.yj
     * @createDate  2021/4/28
     */
    Integer getProjectCheckCount(@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取用户的角色组列表
     * </desc>
     *
     * @param params
     * @return
     * @Author Zhu.yj
     * @createDate  2021/5/16
     */
    List<String> getUserRoleGroupIdList(Map<String, Object> params);
}
